﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace Protocolo
{
    public static class ProtocolRESDownload
    {
        static int CantBytes = 256;


        public static Paquete[] CrearPaquetes(byte[] datos, string nombreArchivo, bool primeraVez, int cantPaquetes, string md5, double tamañoArchivo)
        {
            Paquete[] Paquetes;
            double dCantPaquetes = Math.Ceiling((Double)datos.Length / CantBytes); //ver que sea el techo
            int CantPaquetes = Convert.ToInt32(dCantPaquetes);

            int i = 0;
            int Offset = 0;
            byte[] DatosAux;
            if (primeraVez)
            {
                //Cargar el primer paquete
                //Nombre Archivo
                //Cantidad paquetes
                //MD5

                CantPaquetes++;
                cantPaquetes++;
                var data = Encoding.ASCII.GetBytes(nombreArchivo + "@" + cantPaquetes.ToString() + "@" + md5 + "@-@" + tamañoArchivo + "@");
                Paquete PrimerPaquete = new PaqueteRESDownload(data);
                Paquetes = new Paquete[CantPaquetes];
                Paquetes[i] = PrimerPaquete;
                i++;
            }
            else
            {
                Paquetes = new Paquete[CantPaquetes];
            }

            //Carga el resto
            while (i < CantPaquetes)
            {
                int Size = datos.Length - Offset;
                if (Size > CantBytes)
                {
                    DatosAux = new byte[CantBytes];
                    Buffer.BlockCopy(datos, Offset, DatosAux, 0, CantBytes);
                    Offset += CantBytes;
                }
                else
                {
                    DatosAux = new byte[Size];
                    Buffer.BlockCopy(datos, Offset, DatosAux, 0, datos.Length - Offset);
                }
                Paquete PaqueteREQ = new PaqueteRESDownload(DatosAux);
                Paquetes[i] = PaqueteREQ;
                i++;
            }

            return Paquetes;
        }





        private static string GetMD5(byte[] file)
        {
            MD5 md5Hash = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hash.ComputeHash(file);

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }
    }
}
